/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
var reverseKGroup = function(head, k) {
  const dummy = new ListNode()
  dummy.next = head // 哨兵的后一个是头节点
  let pre = dummy, end = dummy // pre记录开始的前一个，end记录最后一个
  while(end.next !== null) {
    for(let i = 0; i < k && end !== null; i++) end = end.next
    if(end === null) { // 不满足k个节点的数量
      break
    }
    let start = pre.next // 当前的开始
    let nextStart = end.next // 下一个的开始
    end.next = null // 断开，方便翻转操作
    pre.next = reverse(start)
    start.next = nextStart // 翻转完成后，当前的开始变成了当前的结束
    pre = start
    end = pre
  }
  return dummy.next
};
function reverse(lnode) {
  let pre = null
  let cur = lnode
  while(cur) {
    let tmp = cur.next
    cur.next = pre
    pre = cur
    cur = tmp
  }
  return pre
}